package jp.gr.java_conf.koharasjk.syncstickynotes;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Timestamp;

import android.content.Context;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
import android.util.Log;

public class DbUtil {

	// ログ出力用
	private final static String TAG = "DbUtil";

	// 設定の情報を格納するための変数
	private final static String USERNAME_KEY = "username_preference";
	private final static String PASSWORD_KEY = "password_preference";
	private final static String IPADDRESS_KEY = "ipAddr_preference";
	private final static String GUID_KEY = "guid_preference";
	// private final static String TITLE_KEY = "title_preference";

	// DBユーザー名
	private static String userName;

	// DBにアクセスするために必要なパスワード
	private static String userPassword;

	// CentOSのIPアドレス
	private static String ipAddr;

	// DB上で管理されるメモのID
	private static String guid;

	// DB上で管理されるタイムスタンプ
	private static Timestamp timestamp;

	public static void init(Context context) {

		Log.d(TAG, "startInit");

		// 設定を反映させる
		SharedPreferences mSharedPreferences = PreferenceManager
				.getDefaultSharedPreferences(context);
		userName = mSharedPreferences.getString(USERNAME_KEY, "");
		userPassword = mSharedPreferences.getString(PASSWORD_KEY, "");
		ipAddr = mSharedPreferences.getString(IPADDRESS_KEY, "");
		guid = mSharedPreferences.getString(GUID_KEY, "");
		Log.d(TAG, "finishInit");
	}

	// 更新日時を比較する
	// 同期する場合はtrueを返す
	public static boolean compareUpdateSeqNum() {

		Log.d(TAG, "startCompareUpdateSeqNum");

		// 動作フラグ
		boolean flag = false;

		// データベース接続の準備
		Connection conn = null;
		Statement stmt = null;
		ResultSet rs = null;

		// SQL文の定義
		String sql = "SELECT * FROM Note where guid='" + guid + "'";

		try {
			// データベース接続開始
			Class.forName("com.mysql.jdbc.Driver");
			conn = DriverManager.getConnection("jdbc:mysql://" + ipAddr
					+ ":3306/dbssn", userName, userPassword);
			stmt = conn.createStatement();

			// データベースにSQL文を実行
			rs = stmt.executeQuery(sql);

			// カーソルを移動
			rs.next();

			// android にデータがないなら flagをfalseにする(サーバーから新しいデータを読み込む)
			if (timestamp == null) {
				Log.d(TAG, "timestampIsNull");
				flag = false;
			}

			// androidのデータがデータベースのデータと同じなら flagをtrueにする(サーバーに上書き処理をする)
			else if (timestamp.equals(rs.getTimestamp("updateSeqNum"))) {
				Log.d(TAG, "timestamp.equals:true");
				flag = true;
			}

			// androidのデータが新しいなら flagをtrueにする(サーバーに上書き処理をする)
			else if (timestamp.after(rs.getTimestamp("updateSeqNum"))) {
				Log.d(TAG, "timestamp.after:true");
				flag = true;
			}

			// android のデータが古いなら flagをfalseにする(サーバーから新しいデータを読み込む)
			else if (timestamp.before(rs.getTimestamp("updateSeqNum"))) {
				Log.d(TAG, "timestamp.before:true");
				flag = false;
			}

			// いずれでもない場合
			else {
				Log.d(TAG, "これが出たら必ず修正");
				flag = false;
			}

			// 接続のクローズ
			conn.close();
			rs.close();
			stmt.close();

		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}
		Log.d(TAG, "finishCompareUpdateSeqNum");
		return flag;
	}

	// データベースからデータを取得する
	public static String dbSelect() {

		Log.d(TAG, "dbSelect");

		// 付箋の内容を保持する部分
		String content = new String();

		// 　データベース接続の準備
		Connection conn = null;
		Statement stmt = null;
		ResultSet rs = null;

		// SQL文
		String sql = "SELECT * FROM Note where guid='" + guid + "'";

		// データベース接続の開始
		try {
			Class.forName("com.mysql.jdbc.Driver");
			conn = DriverManager.getConnection("jdbc:mysql://" + ipAddr
					+ ":3306/dbssn", userName, userPassword);
			stmt = conn.createStatement();
			rs = stmt.executeQuery(sql);
			rs.next();
			content = rs.getString("content");
			Log.d(TAG, content);
			conn.close();
			rs.close();
			stmt.close();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return content;
	}

	// サーバーのデータベースに上書きする
	public static void dbUpdate(String content) {
		Log.d(TAG, "dbUpdate");

		// タイトル実装まで一時的に使用
		String title = "タイトル";

		Connection conn = null;
		Statement stmt = null;
		String sql = "update Note set title= '" + title + "',content= '"
				+ content + "' where guid='" + guid + "';";
		try {
			Class.forName("com.mysql.jdbc.Driver");
			conn = DriverManager.getConnection("jdbc:mysql://" + ipAddr
					+ ":3306/dbssn", userName, userPassword);
			stmt = conn.createStatement();
			stmt.executeUpdate(sql);
			conn.close();
			stmt.close();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	// // 新しいノートを新規作成
	// // guidに触れてないのでデータを消すことがあるのでまだ使えない
	// public void dbInsert(String title, String content) {
	// Connection conn = null;
	// Statement stmt = null;
	// String sql = "insert into Note(title,content) values('" + title + "','"
	// + content + "');";
	// try {
	// Class.forName("com.mysql.jdbc.Driver");
	// conn = DriverManager.getConnection("jdbc:mysql://" + ipAddr
	// + ":3306/dbssn", userName, userPassword);
	// stmt = conn.createStatement();
	// stmt.executeUpdate(sql);
	// conn.close();
	// stmt.close();
	//
	// } catch (ClassNotFoundException e) {
	// e.printStackTrace();
	// } catch (SQLException e) {
	// e.printStackTrace();
	// } catch (Exception e) {
	// e.printStackTrace();
	// }
	// }

}
